package logica.analizador;

import java.util.Stack;
import java.util.Vector;

import logica.common.NodoVinculo;
import logica.common.TagCollection;
import logica.common.TagCollection.tagTipo;

import excepciones.ContenidoException;
import excepciones.DataStructureException;

public class DocumentoJerarquicoEnlazado extends DocumentoJerarquico
{
	private final String tagAperturaEnlace = "<vin>";
	private final String tagCierreEnlace = "</vin>";	
	
	public DocumentoJerarquicoEnlazado(String texto) throws ContenidoException, DataStructureException
	{
		super(texto);
	}
	
	public Vector<String> getTitulos() throws ContenidoException, DataStructureException
	{
		Vector <String> resultado =  new Vector<String>();
		
		if (!this.getTitulo().isEmpty())
		{
			resultado.addElement(this.getTitulo());	
		}
		
		
		if (this.tieneSecciones(this.getContenido()) > 0)
		{
			Vector<String> secciones = this.getContenidoSecciones();
			for(int i=0; i<secciones.size(); i++)
			{
				DocumentoJerarquicoEnlazado nuevaSeccion = new DocumentoJerarquicoEnlazado(secciones.get(i));
				resultado.addAll(nuevaSeccion.getTitulos());
			}
		}

		return resultado;
	}
	
	public Vector<String> getEnlaces()
	{
		Vector<String> enlaces = new Vector();
		String contenido = this.getContenido();
		
		while (contenido.length() > 0)
		{
			//TODO
			//Cambiar por clase de tags
			int iApertura = (contenido.indexOf(tagAperturaEnlace)!=-1)? contenido.indexOf(tagAperturaEnlace)+5 :-1;
			int iCierre = contenido.indexOf(tagCierreEnlace);
			
			if (iApertura!=-1 && iCierre!=-1)
			{
				enlaces.add(contenido.substring(iApertura, iCierre));
				contenido = contenido.substring(iCierre+6);
			}
			else
				break;
		}
		
		return enlaces;
	}

	public Vector getSeccion(String textoTitulo) throws ContenidoException, DataStructureException
	{
		Vector resultado = new Vector();
		if (this.getTitulo().equals(textoTitulo) || textoTitulo.isEmpty())
		{
			boolean firstTime = false;
			if (textoTitulo.isEmpty())
			{
				firstTime = true;
			}
			resultado = this.formatearATextoEnlazado(this.getContenido(), firstTime);
		}
		else
		{
			Vector<String> secciones = this.getContenidoSecciones();
			for(int i=0; (resultado.size() == 0 && i<secciones.size()); i++)
			{
				DocumentoJerarquicoEnlazado nuevaSeccion = new DocumentoJerarquicoEnlazado(secciones.get(i));
				resultado = nuevaSeccion.getSeccion(textoTitulo);
			}
		}
		return resultado;
		
	}

	private Vector formatearATextoEnlazado(String aTexto, boolean firsTime) throws DataStructureException, ContenidoException 
	{
		Vector resultado=new Vector();
		String sContTag="";

		if (this.tieneSecciones(aTexto) > 0)
		{
			Vector<String> secciones = this.obtenerContenidoSecciones(aTexto);
			
			for(int i=0; i < secciones.size(); i++)
			{
				DocumentoJerarquicoEnlazado nuevaSeccion = new DocumentoJerarquicoEnlazado(secciones.get(i));
				
				if (firsTime)
				{
					resultado.addElement(new NodoVinculo(nuevaSeccion.getTitulo(), nuevaSeccion.getTitulo()+'\n'));
				}
				else
				{
					resultado.addElement('\n'+nuevaSeccion.getTitulo()+'\n');
					resultado.addAll(formatearATextoEnlazado(nuevaSeccion.getContenido(), firsTime));
				}
			}
		}
		else
		{
			while (aTexto.length()>0)
			{	//Caso base ya recorrimos y extragimos la seccion que queriamos.
				int aperturaTag = aTexto.indexOf("<ira>");
				int cierreTag = aTexto.indexOf("</ira>");
				if (aperturaTag != -1 && cierreTag != -1)
				{
					resultado.addElement(aTexto.substring(0, aperturaTag).replace("\t", "").replace("\n", ""));
					sContTag = aTexto.substring(aperturaTag, cierreTag+1);
					String vinculo = sContTag.substring(sContTag.indexOf("<vin>")+5,sContTag.indexOf("</vin>"));
					String etiqueta = sContTag.substring(sContTag.indexOf("<eti>")+5,sContTag.indexOf("</eti>"));
					resultado.addElement(new NodoVinculo(vinculo, etiqueta));
	
					aTexto = aTexto.substring(cierreTag+6);
				}
				else
				{
					resultado.addElement(aTexto.replace("\t", "").replace("\n", ""));
					break;
				}
			}
		}
		return resultado;
	}

	
}	